package com.uziot.activiti6.service;

import com.uziot.activiti6.common.dto.*;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.runtime.ProcessInstance;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * @author shidt
 * @version V1.0
 * @className ActivitiService
 * @date 2021-02-26 10:38:41
 * @description 工作流服务接口
 */

public interface ActivitiService {

    /***
     * 发布规则
     * @param bpmnName bpmnName
     */
    void deploy(String bpmnName);


    /***
     * 发布规则
     * @param fileInputStream 文件流
     * @param fileName 文件名称
     */
    void deploy(InputStream fileInputStream, String fileName);

    /***
     *  开始流程
     * @param instanceKey 流程实例key
     * @param variables 参数
     * @return 流程实例
     */
    ProcessInstance startProcessInstance(String instanceKey, Map<String, Object> variables);

    /***
     * 通过key获取流程定义明细列表
     * @param instanceKey instanceKey
     * @return List
     */
    List<ProcessDefinitionDTO> processDefinitionQuery(String instanceKey);

    /***
     * 查询用户任务列表
     * @param assignee 任务执行人
     * @param candidateUser 候选用户
     * @param candidateGroup 候选用户组
     * @param firstResult 起始条数
     * @param maxResults 最大的结果数
     * @return List
     */
    List<TaskDTO> queryTask(String assignee, String candidateUser,
                            String candidateGroup, int firstResult, int maxResults);

    /**
     * 查询我的待办事项
     *
     * @param processQueryInDTO 入参封装
     * @return 列表
     */
    List<MyTodoOutDTO> getTodoTasks(ProcessQueryInDTO processQueryInDTO);

    /**
     * 我已经办结的事项
     *
     * @param processQueryInDTO 入参封装
     * @return 列表
     */
    List<MyDoneOutDTO> getDoneTasks(ProcessQueryInDTO processQueryInDTO);

    /**
     * 我的申请列表
     *
     * @param processQueryInDTO 入参封装
     * @return 列表
     */
    List<MyApplyOutDTO> getApplyTasks(ProcessQueryInDTO processQueryInDTO);


    /***
     * 查询任务参数
     * @param taskId taskId
     * @return Map
     */
    Map<String, Object> queryVariables(String taskId);


    /***
     * 根据实例ID查询任务审核历史
     * @param processInstanceId 实例ID
     * @return List
     */
    List<HistoricTaskInstanceDTO> queryTaskHistory(String processInstanceId);

    /***
     * 根据实例ID查询任务审核历史
     * @param processInstanceId 实例ID
     * @return List
     */
    List<HistoricVariableInstance> queryTaskHistoryVariables(String processInstanceId);

    /***
     * 完成任务
     * @param taskId 任务id
     * @param assignee 分配到任务的人
     * @param variables 表单参数信息
     * @param param 返回值
     */
    void completeTask(String taskId, String assignee, Map<String, Object> variables, Map<String, Object> param);

    /****
     * 任务指派
     * @param taskId taskId
     * @param assignee assignee
     */
    void claimTask(String taskId, String assignee);

    /**
     * 删除任务
     *
     * @param taskId taskId
     */
    void deleteTask(String taskId);

    /**
     * 删除任务
     *
     * @param processInstanceId taskId
     * @param deleteReason      删除原因
     */
    void deleteRuntimeTask(String processInstanceId, String deleteReason);


    /****
     * 流程是否完成
     * @param processInstanceId processInstanceId
     * @return boolean
     */
    boolean isFinishProcess(String processInstanceId);


    /***
     * 查询待办任务
     * @param firstResult 开始位置
     * @param maxResults 最大记录数
     * @return List
     */
    List<TaskDTO> queryWaitTask(int firstResult, int maxResults);

    /***
     * 驳回任务
     * @param taskId 当前节点
     * @param assignee 操作人
     * @param variables 赋值
     * @param returnStart 是否返回到起点
     */
    void rejectTask(String taskId, String assignee, Map<String, Object> variables, boolean returnStart);

    /**
     * 根据一个流程实例的id挂起流程实例
     *
     * @param processInstanceId 流程实例id
     */
    void suspendProcessInstance(String processInstanceId);

    /**
     * 根据一个流程实例的id激活流程实例
     *
     * @param processInstanceId 流程实例id
     */
    void activateProcessInstance(String processInstanceId);

    /**
     * 根据发布id批量挂起流程
     *
     * @param deploymentIds 发布ID
     */
    void suspendProcessDefinitionByIds(List<String> deploymentIds);

    /**
     * 根据发布id批量激活流程
     *
     * @param deploymentIds 发布ID
     */
    void activateProcessDefinitionByIds(List<String> deploymentIds);

    /**
     * 撤回审批
     *
     * @param oldTaskId 已审批的任务ID
     * @param username  用户名
     */
    void withdrawApproval(String oldTaskId, String username);

    /**
     * 获取流程实例流转意见
     *
     * @param processInstanceId 流程实例ID
     * @return ProcessQuery
     */
    List<CommentOutDTO> getProcessInstanceComments(String processInstanceId);
}